package main

import (
	"errors"
	"fmt"
	"os"
	"time"
)

type MyError struct {
	when time.Time
	what string
}

func main() {
	file, err := os.Open("/abc.txt")
	if err != nil {
		fmt.Println("打开文件错误,错误信息", err.Error())
	} else if file == nil {
		fmt.Println("文件是空的")
	} else {

		fmt.Println("文件正常打开,文件名 ", file.Name())
	}

	//自定义错误异常提示信息,第1种
	err1 := errors.New("自己创建的错误")
	fmt.Println("自定义错误信息1 ", err1.Error())
	//自定义错误异常提示信息,第2种
	err2 := fmt.Errorf("自定义错误信息 %s ", " no such file ")
	fmt.Println("自定义错误信息2 ", err2.Error())

	//error 对象在函数中的使用
	age1, err3 := checkAge(-1)
	if err3 != nil {
		fmt.Printf("错误数据, 年龄 == %s , 错误信息 == %s \n ", age1, err3.Error())
	}
	age2, err4 := checkAge(10)
	if err4 == nil {
		fmt.Printf("正常数据, 年龄 == %s \n ", age2)
	}

	//使用自定义错误异常
	age3, err5 := checkAge2(-1)
	if err5 != nil {
		fmt.Printf("错误数据, 年龄 == %s , 错误信息 == %s \n ", age3, err5.Error())
	}

}

func checkAge(age int) (string, error) {
	if age < 0 {
		err := errors.New("输入的年龄不正确")
		return "", err
	}
	return fmt.Sprintf("输入的年龄是 %d ", age), nil
}

func (e MyError) Error() string {
	return fmt.Sprintf("when %v , what %v \n", e.when, e.what)
}

func checkAge2(age int) (string, error) {
	if age < 0 {

		return "", MyError{time.Now(), "年龄不能为负数"}
	}

	return "输入的年龄正确", nil

}
